package com.wangdong.juc;

import org.openjdk.jol.info.ClassLayout;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 自jdk 1.5之后，Java对Synchronized进行了升级，不再直接采用向之前那样直接上来就是重量级锁，直接采用锁总线的方式
 * Synchronized 锁升级过程：无锁，偏向锁，轻量级锁(CAS)，重量级锁(锁总线，效率低)
 * Synchronized 锁的是对象，会在对象头上标记，用jol打印后可以看出
 */
public class SynchronizedTest {

    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        // 没有锁（non-biasable）
        System.out.println(ClassLayout.parseInstance(o).toPrintable());

        TimeUnit.SECONDS.sleep(5);
        System.out.println(ClassLayout.parseInstance(o).toPrintable());

        // 此时会升级为轻量级锁(thin lock)
        synchronized (o){
            System.out.println(ClassLayout.parseInstance(o).toPrintable());
        }

        ExecutorService executorService = Executors.newCachedThreadPool();
        // 当开启一个线程时，此时还没有其他线程与之争抢，此时还是轻量级锁(thin lock)，当开启2个及以上的线程时，会升级为重量级锁(fat lock)
        for(int i = 0; i < 2; i++){
            executorService.submit(()->{
                synchronized (o){
                    //
                    System.out.println(ClassLayout.parseInstance(o).toPrintable());
                }
            });
        }
        System.out.println("==执行完成==");

    }
}
